package Testes;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import Projeto.*;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class TestaRecomendacoes { 
	
	Date dt = new Date();
	
	Recomendacoes recomendacao1;
	
	
	public void lerArquivoEstabelecimentos() throws Exception{
	LerListaEstabelecimentos teste = new LerListaEstabelecimentos("Estabelecimentos.data");
	}
	
	public void lerArquivoOpnioes() throws Exception{
		LerListaOpinioes teste2 = new LerListaOpinioes("Opinioes.data");
	}
	
	@Test(expected=Exception.class)
	public void testaTestaConstrutorCaracterInvalido()throws Exception{
		lerArquivoEstabelecimentos();
		new Recomendacoes("%&");
	}
	@Test(expected=Exception.class)
	public void testaTestaConstrutorNomeInvalido()throws Exception{
		lerArquivoEstabelecimentos();
		new Recomendacoes("teste");
	}
	@Test(expected=Exception.class)
	public void testaTestaConstrutorNumeroInvalido()throws Exception{
		lerArquivoEstabelecimentos();
		new Recomendacoes("3.4");
	}
	@Test(expected=Exception.class)
	public void testaTestaConstrutorMaiorQueTamnhoListaEstabelecimentos()throws Exception{
		lerArquivoEstabelecimentos();
		new Recomendacoes("1000");
	}	
	@Test
	public void testaTestaConstrutorOK()throws Exception{
		lerArquivoEstabelecimentos();
		new Recomendacoes("1");
	}
	
	
	@Test
	public void testaAlgoritmoPopularidade() throws Exception{
	
		List<String> listaTesteAux = new ArrayList<String>();
		listaTesteAux.add("Trailer do Marcus");
		listaTesteAux.add("Bar do Cuscuz e Restaurante");
		listaTesteAux.add("Bonaparte");
	
		lerArquivoOpnioes();
		lerArquivoEstabelecimentos();
		recomendacao1 = new Recomendacoes("4");
		
		Assert.assertTrue("Erro de Asser", recomendacao1.algoritmoPopularidade(3).contains("Trailer do Marcus"));
		Assert.assertFalse("Erro de Asser", recomendacao1.algoritmoPopularidade(3).contains("Baixinhos Bar"));
		
		Assert.assertEquals("Erro de assert", listaTesteAux.get(0), recomendacao1.algoritmoPopularidade(3).get(0));
		Assert.assertEquals("Erro de assert", listaTesteAux.get(1), recomendacao1.algoritmoPopularidade(3).get(1));
		Assert.assertEquals("Erro de assert", listaTesteAux.get(2), recomendacao1.algoritmoPopularidade(3).get(2));
	}
	
	@Test
	public void testaAlgoritmoPersonalizado() throws Exception{
		
		List<String> listaNotasTeste = new ArrayList<String>();
		List<String> listaResultadoEsperado = new ArrayList<String>();
		Usuario userTempo;
		
		listaResultadoEsperado.add("Bar do Cuscuz e Restaurante");
		listaResultadoEsperado.add("Cantina do Hall das Placas");
		
		lerArquivoOpnioes();
		lerArquivoEstabelecimentos();
		recomendacao1 = new Recomendacoes("4");
		
		for (int i = 0; i < LerListaEstabelecimentos.listaRestaurantes.size(); i++) {
			listaNotasTeste.add("0");
		}

		userTempo = new Usuario("UserTeste", listaNotasTeste, dt.toLocaleString());
		
		Assert.assertTrue("Erro de assert",recomendacao1.algoritmoPersonalizado(2, userTempo).contains("Bar do Cuscuz e Restaurante"));
		Assert.assertFalse("Erro de assert",recomendacao1.algoritmoPersonalizado(2, userTempo).contains("Fazenda"));
		Assert.assertFalse("Erro de assert",recomendacao1.algoritmoPersonalizado(2, userTempo).contains("Bar do Santos"));
		
		Assert.assertEquals("Erro de assert", listaResultadoEsperado.get(0),recomendacao1.algoritmoPersonalizado(2, userTempo).get(0));
		Assert.assertEquals("Erro de assert", listaResultadoEsperado.get(1),recomendacao1.algoritmoPersonalizado(2, userTempo).get(1));
	}
	
}
